﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using R = Szamlazz.Data.Request;

namespace Szamlazz.Data
{ 
	/// <summary>
	/// Vevői információ
	/// </summary>
	public class CustomerInfo : Validatable
	{
		/// <summary>
		/// Konstrucktor
		/// </summary>
		public CustomerInfo()
		{
			this.MailAddress = this.PrimaryAddress = new AddressInfo();
		}

		/// <summary>
		/// Alapértelmezett cím
		/// </summary>
		public AddressInfo PrimaryAddress { get; private set; }
		/// <summary>
		/// Postázási cím (opcionális)
		/// </summary>
		public AddressInfo MailAddress { get; private set; }

		/// <summary>
		/// Komponens típus szövege loggoláshoz
		/// </summary>
		internal override string Component
		{
			get { return "vevő"; }
		}

		/// <summary>
		/// Megadja, hogy a postázási cím azonos-e az elsődleges címmel
		/// </summary>
		public bool IsSameAddress
		{
			get { return object.ReferenceEquals(this.PrimaryAddress, this.MailAddress); }
			set
			{
				if (value)
				{
					this.MailAddress = this.PrimaryAddress;
				}
				else
				{
					this.MailAddress = new AddressInfo();
					this.MailAddress.Name = this.PrimaryAddress.Name;
				}
			}
		}

		/// <summary>
		/// Létrehozza az XML kommunikációs objektumot
		/// </summary>
		/// <returns>Vevő típus</returns>
		internal R.vevoTipus CreateForRequest()
		{
			return new R.vevoTipus
			{
				adoszam = this.TaxNumber,
				cim = this.PrimaryAddress.Address,
				irsz = this.PrimaryAddress.ZIPCode,
				nev = this.PrimaryAddress.Name,
				email =this.Email,
				megjegyzes =this.Note,
				orszag = this.PrimaryAddress.Country,
				telepules = this.PrimaryAddress.City,
				telefonszam = this.Phone,
			};
		}

		/// <summary>
		/// Validálja a vevő kötelező mezőinek kitöltöttségét 
		/// </summary>
		/// <returns><see cref="ValidationResult"/> eredmény</returns>
		internal override ValidationResult Validate()
		{
			var ret = base.Validate();

			//ret.Evaluate(string.IsNullOrEmpty(this.TaxNumber), "adószám", ValidationResult.ValidationReason.Required);
			ret.Evaluate(string.IsNullOrEmpty(this.PrimaryAddress.ZIPCode), "irányítószám", ValidationResult.ValidationReason.Required);
			ret.Evaluate(string.IsNullOrEmpty(this.PrimaryAddress.City), "város", ValidationResult.ValidationReason.Required);
			ret.Evaluate(string.IsNullOrEmpty(this.PrimaryAddress.Name), "név", ValidationResult.ValidationReason.Required);
			ret.Evaluate(string.IsNullOrEmpty(this.PrimaryAddress.Address), "cím", ValidationResult.ValidationReason.Required);

			return ret;
		}

		/// <summary>
		/// Vevő email címe
		/// </summary>
		public string Email { get; set; }
		/// <summary>
		/// Vevő adószáma
		/// </summary>
		public string TaxNumber { get; set; }
		/// <summary>
		/// Számlán szereplő megjegyzés
		/// </summary>
		public string Note { get; set; }
		/// <summary>
		/// Vevő telefonszáma
		/// </summary>
		public string Phone { get; set; }
	}
}
